In [1]:
import numpy as np
import math
import os
import time
In [2]:
from sklearn import mixture
In [3]:
# import custom functions
import sys
# path to libraries
# currently in ../scripts-lib/
tool_path = os.path.abspath('../scripts-lib')
if tool_path not in sys.path:
sys.path.append(tool_path)
import lib_phones as lph
# print the loaded functions
print dir(lph)[5:]
In [4]:
# load phone list
phone_path = os.path.abspath('../datasets/TIMIT-MFCCs/TIMIT_phone_list.txt')
phone_list = lph.load_phone_file(phone_path)
print len(phone_list), phone_list
In [5]:
#load mfccs into sklearn observations, each frame is an obs
train_TIMIT_dir = os.path.abspath('../datasets/TIMIT-MFCCs/dev')
train_obs = []
train_obs_labels = []
# walk the directories
for (path, dirs, files) in os.walk(train_TIMIT_dir):
print "working in path : " + path
for file in files:
# skip the SA files
#dev, only work on file si1573.mfcc.csv "si1573" in file and
if ".mfcc" in file and "sa" not in file:
#check if corresponding .phn file exists
if not os.path.exists(path + "/" + file[:-8] + "phn"):
print path + "/" + file[:-8] + "phn"
print "corresponding .phn file does not exist!"
else:
print "working on: " + file
# print "from path : " + path
# open the files
mfcc_file = open(path + "/" + file)
phn_file = open(path + "/" + file[:-8] + "phn")
# extract phone times
phone_times = []
for phn_line in phn_file:
phone_times.append(phn_line.split())
# transpose for easier use
phone_times = map(list, zip(*phone_times))
# skip mfcc_file header
next(mfcc_file)
# reset frame count
frame_cnt = 0
# for each line of mfcc_file
for mfcc_line in mfcc_file:
# increment frame count
frame_cnt += 1
# print "frame line #:", frame_cnt
# frame start time in seconds
start_t = mfcc_line.split(";")[1]
# create frame (skiping first 2 values, frame_index and frame_time)
frame = map( float, mfcc_line.split(";")[2:])
# print numpy.shape(frame)
# print frame
# find correspond phoneme and index in the list
phn_index = lph.find_phone_index(start_t, phone_times, phone_list)
# add to instances
train_obs.append(frame)
train_obs_labels.append(phone_list[phn_index])
In [6]:
print np.shape(train_obs)
print np.shape(train_obs_labels)
In [7]:
print train_obs[0]
print train_obs_labels[0:100]
In [8]:
#create gmm
num_components = 10
num_iter=2
g = mixture.GMM(n_components= num_components, n_iter=num_iter)
In [9]:
# fit the GMM to the observations
g.fit(train_obs)
Out[9]:
In [10]:
# pred = g.predict(train_obs)
# print train_obs_labels
# print pred
In [11]:
print np.round(g.score(train_obs).mean(), 2)
print np.round(g.score(train_obs).var(), 2)
print np.round(g.score(train_obs)[0:5] )
In [12]:
# refit, time
t0 = time.time()
g.fit(train_obs)
t1 = time.time()
print num_components, "components", num_iter, "iterations in ", t1-t0, "for", len(train_obs_labels), "observations."
In [13]:
print np.round(g.score(train_obs).mean(), 2)
print np.round(g.score(train_obs).var(), 2)
print np.round(g.score(train_obs)[0:5] )
Refitting does work as expected. (does not reset gmm).
In [14]:
#save gmm in pickled form
import cPickle as pickle
# name and location to save in
pickle_name = "TIMIT_ubm_gmm_" + str(num_components) + ".pckl"
pickle_dir = os.path.abspath('../datasets/TIMIT Pickled Data')
if not os.path.isdir(pickle_dir):
os.makedirs(pickle_dir)
pickle.dump( g, open( pickle_dir + os.sep + pickle_name, "wb") )
print "saved gmm in ", pickle_dir + '\\' + pickle_name
In [15]:
# reload pickled file for testing
g2 = pickle.load( open(pickle_dir + os.sep + pickle_name, "rb") )
print "loaded gmm from ", pickle_dir + os.sep + pickle_name
In [ ]: